#ifndef _app_manager_H__
#define _app_manager_H__

#ifdef __cplusplus
extern "C"
{
#endif

#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include "app_manager_conf.h"
#include "inc/app_manager_type.h"
#include "inc/app_manager_app.h"
#include "inc/app_manager_ui.h"
#include "inc/app_manager_fs.h"

#if APP_MANAGER_LIB_ENABLE

#if (APP_MANAGER_MALLOC_FREE_USE_CLIB == false)
    /**
     * @brief 注册malloc和free回调函数
     *
     * @param malloc
     * @param free
     */
    app_manager_ret_t app_manager_register_malloc_free_cb(void *(*malloc_cb)(size_t size), void (*free_cb)(void *ptr));
#endif

#if (APP_MANAGER_SUPPORT_RTOS && !APP_MANAGER_PLATFORM_ESP)
    /**
     * @brief 注册多线程互斥锁回调,在多线程使用时必须进行注册后才能使用其他函数
     *
     * @param cb
     * @return app_manager_ret_t
     */
    app_manager_ret_t app_manager_register_mutex_cb(app_manager_mutex_cb_t *cb);
#endif

    /**
     * @brief 注册app的用户函数，由用户在外部任意地方实现关联即可,在调用app_manager_init时会自动调用此函数进行app注册,esp平台此函数需放在main文件夹内
     */
    extern void app_manager_register(void);

    /**
     * @brief app管理器初始化,调用前请确保所有需要注册的回调函数都已经注册,如在初始化过程死机，可尝试在app注册函数起始和结束位置添加GUI线程锁以解决线程冲突的问题
     *
     * @return app_manager_ret_t
     */
    app_manager_ret_t app_manager_init();

    /**
     * @brief app管理器任务
     *
     * @param task 任务类型
     * @param arg 参数
     * @return app_manager_ret_t
     */
    app_manager_ret_t app_manager_task(app_manager_task_t task, void *arg);

#endif // APP_MANAGER_LIB_ENABLE

#ifdef __cplusplus
}
#endif
#endif
